package cn.toutatis.basics

/**
 * 10-If条件和 range判断
 * */
class `A10_If&Range` {

    /*条件判断*/
    fun ifAndElse(): Unit {
        val a = 5
        val b= 6

        // 传统用法
        var max: Int = a
        if (a < b) max = b

        // With else
        if (a > b) {
            max = a
        } else {
            max = b
        }

        // 作为表达式
        val max1 = if (a > b) a else b
    }


    /**
     * when 将它的参数与所有的分支条件顺序比较，直到某个分支满足条件。
     * when 既可以当做表达式使用也可以被当做语句使用。如果它被当做表达式，
     * 符合条件的分支的值就是整个表达式的值，如果当做语句使用， 则忽略个别分支的值。
     * （像 if 一样，每一个分支可以是一个代码块，它的值是块中最后的表达式的值。）
     * 如果其他分支都不满足条件将会求值 else 分支。
     * 如果 when 作为一个表达式使用，则必须有 else 分支，
     * 除非编译器能够检测出所有的可能情况都已经覆盖了［例如，对于 枚举（enum）类条目与密封（sealed）类子类型］。
     */
    /*when 表达式取代了类 C 语言的 switch 语句。其最简单的形式如下*/
    fun whenSwitch(x : Any): Unit {
        when (x) {
            1 -> print("x == 1")
            2 -> print("x == 2")
            /*相同条件进入判断可以用逗号分割*/
            0,3 -> print("相同条件进入判断可以用逗号分割")
            in 4..7 -> print("我们可以用任意表达式（而不只是常量）作为分支条件")
            /*另一种可能性是检测一个值是（is）或者不是（!is）一个特定类型的值。注意： 由于智能转换，你可以访问该类型的方法与属性而无需任何额外的检测。*/
            is String -> print("参数是字符串")

            else -> { // 注意这个块
                print("x is neither 1 nor 2")
            }
        }
    }

    /*区间判断*/
    fun range(): Unit {
        val x = 10
        val y = 9
        /*使用 in 运算符来检测某个数字是否在指定区间内*/
        if (x in 1..y+1) {
            println("fits in range")
        }
    }

    /*区间检测*/
    fun rangeOut(): Unit {
        val list = listOf("a", "b", "c")

        /*检测某个数字是否在指定区间外*/
        if (-1 !in 0..list.lastIndex) {
            println("-1 is out of range")
        }
        if (list.size !in list.indices) {
            println("list size is out of valid list indices range, too")
        }
    }

    /*使用区间进行循环*/
    fun rangeLoop(){
        for (x in 1..5) {
            print(x)
        }
    }
}